## 初识函数

''' 注意：不在类里面定义的def叫函数，在类里面的def 叫方法。。。'''

# 🚩案例一
# 定义一个计算两个相加=和 的函数
def addNum(num1, num2):
    ''' 一个计算加法的函数 '''
    res = num1 + num2
    return res

# 函数引用
r = addNum(5, 10)
print(r)


# 🚩案例二  使用不可变对象作为入参
''' 
！！！注意：不可变对象 作为入参值，在函数中修改了不可变对象，但不会影响到实际参数的值（换句话说就是不会有任何改变） '''
def funStr(arg1, arg2):
    ''' 一个尝试改变不可变对象 值的函数 '''
    print('入参：', arg1, arg2)
    arg1 = arg1+'_abc'
    print('修改arg1：', arg1)

s1 = '张三'
s2 = '王五'
funStr(s1, s2)
print('s1 的值：', s1)

# 执行结果
'''
入参： 张三 王五
修改arg1： 张三_abc
s1 的值： 张三
'''


# 🚩案例三 函数注释的使用
def casef(ham: 42, eggs: int = 'spam') -> "Nothing to see here'":
    ''' 测试函数 注释案例 '''
    print("函数注释", casef.__annotations__)
    print("参数值打印", ham, eggs)
    print("参数类型打印", type(ham),type(eggs))
    return 'res'

casef("www")

# 执行结果：
'''
函数注释 {'ham': 42, 'eggs': <class 'int'>, 'return': "Nothing to see here'"}
参数值打印 www spam
参数类型打印 <class 'str'> <class 'str'>
'''


# 🚩案例四 函数为入参设置默认值
def funDefaultParam(arg1, arg2 = 10):
    print(arg1, 'arg2 默认值：', arg2)

funDefaultParam(12)
# funDefaultParam(12, 22)


# 🚩案例五 注意：可变位置参数与可变关键字参数，在函数定义时只能定义一个！！！
# 可变位置参数    ：返回元组
# 可变关键字参数  ：返回字典
def fun51(*args):
    print('*args可变位置参数：', args)

fun51(12)
# *args可变位置参数： (12,)
fun51(12, 24, 55)
#*args可变位置参数： (12, 24, 55)


def fun52(**args):
    print('**args可变关键字参数：', args)

fun52(a='abc', b=34, c=True)
# **args可变关键字参数： {'a': 'abc', 'b': 34, 'c': True}


# 实战
def fun61(a, b, c):
    print('a', a)
    print('b', b)
    print('c', c)

# 数值传参
fun61(1, 2, 3)
# 字典传参
dictVal = dict({'a':1, 'b':2, 'c':3})
fun61(**dictVal)
# 列表传参
lstVal = [12, 43, 32]
fun61(*lstVal)